package com.sky.task;

import com.sky.entity.Orders;
import com.sky.mapper.OrdersMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.function.Consumer;

/**
 * PROJECT_NAME: sky-take-out
 * NAME: OrdersTask
 * USER: zhang
 * DATE: 2023/6/2
 * DESCRIPTION :订单状态的定时任务(处理未付款订单/派送中的订单)
 */
@Slf4j
@Component
public class OrdersTask {
    @Resource
    private OrdersMapper ordersMapper;

    /**
     * 定时处理超过下单15分钟未付款的订单信息
     */
    @Scheduled(cron = "0 * * * * ? ")//每月每天每时每分钟的0秒执行
    public void scheduledProcessPendingPaymentOrders() {
        log.info("【开始】处理订单超过15分钟未付款的订单信息");
        //封装查询的时间
        LocalDateTime orderTime = LocalDateTime.now().minusMinutes(15);
        //查询付款时间小于15分钟并且订单状态是待付款的订单信息
        List<Orders> ordersList = ordersMapper.selectOrderByStatusAndLtOrderTime(Orders.PENDING_PAYMENT, orderTime);
        //遍历集合将集合中的每一个订单信息中的状态修改为取消/声明取消原因和取消时间,再重新更新到表中
        ordersList.forEach(orders -> {
            orders.setStatus(Orders.CANCELLED);
            orders.setCancelTime(LocalDateTime.now());
            orders.setCancelReason("订单支付超时，自动取消");
            ordersMapper.updateOrder(orders);
        });
    }

    /**
     * 定时处理昨天一直处于派送中的订单信息(修改为已完成)
     * SELECT * FROM orders WHERE status = 4 AND order_time < 当前时间的1小时前
     */
    @Scheduled(cron = "0 0 1 * * ? ")//每月每天凌晨1点0分0秒执行
    public void scheduledProcessDeliveryInProgressOrders(){
        log.info("【开始】处理订单超过15分钟未付款的订单信息");
        //封装查询时间
        LocalDateTime orderTime = LocalDateTime.now().minusHours(1);
        //查询昨天一直处于派送中的订单信息
        List<Orders> ordersList = ordersMapper.selectOrderByStatusAndLtOrderTime(Orders.DELIVERY_IN_PROGRESS, orderTime);
        ordersList.forEach(orders -> {
            //指定订单状态为已完成
            orders.setStatus(Orders.CANCELLED);
            //指定送达时间
            orders.setDeliveryTime(LocalDateTime.now());
            //基于订单持久层修改订单信息
            ordersMapper.updateOrder(orders);
        });

    }
}
